/**
 * Object是最常用的一种引用类型数据，可用于存储值对的集合，
 * 在ECMAScript 1st里添加的
 * 
 * Map是键值对的集合，采用Hash结构存储，在ECMAScript
 * 2015版本里新增的
 */

// 为什么要新增Map结构呢？
/**
 * 共同点：键值对的动态结合，支持增加和删除键值对
 */
// Object
// 定义：
// const obj = {
//     a:1,
//     b:2
// }
// // 添加键值对
// obj.c = 3;
// // 删除键值对
// delete obj.c;
// Map
// 定义：
// const map = new Map();
// // 添加键值对
// map.set('a',1);
// map.set('b',2);
// // 删除键值对
// map.delete('a');

// 不同点列表分别有：
/**
 * 1.构造方式。 2.键的类型。 3.键的顺序。 4.键值对size
 * 5.键值对的访问。 6.迭代器。 7.JSON序列化。 8.应用场景
 */
/**
 * 2.键的类型-Object
 * 键类型必须是String或者Symbol,如果非String类型，会进行数据类型转换
 * 2.键的类型-Map
 * 可以是任意类型，包括对象，数组，函数等，不会进行类型转换。
 * 在添加键值对时，会通过严格相等(===)来判断属键是否存在
 * 特例：
 * NaN===NaN 返回 false
 * const map = new Map();
 * map.set(NaN,1);
 * map.set(NaN,2);
 * map返回是{NaN => 2}
 */
/**
 * 3.键的顺序-Object
 * key是无序的，不会按照添加的顺序返回
 * 1).对于大于等于0的整数，会按照大小进行排序，
 * 对于小数和负数会当做字符串处理.
 * 2).对于String类型，按照定义的顺序进行输出.
 * 3).对于Symbol类型，会直接过滤掉，
 * 不会进行输出如果想要输出Symbol类型属性，
 * 通过Object.getOwnPropertySymbols()方法。
 * 3.键的顺序-Map
 * key是有序的，按照插入的顺序进行返回
 */
/**
 * 4.键值对size-Object
 * 只能手动计算，通过Object.keys0)方法或者通过for...in循
 * 环统计
 * 4.键值对size-Map
 * 直接通过size属性访问
 */
/**
 * 5.键值对访问-Object
 * 1).太内疚或者修改属性，通过点或者中括号的形式
 * 2).判断属性释是否存在
 * 3).删除属性，通过delete关键字
 * 5.键值对访问-Map
 * ...
 */
/**
 * 6.迭代器-for...of -Object
 * Object本身不具有lterator特性，默认情况下不能使用for...of进行遍历
 * 如果执行了就会报错
 * 6.迭代器-for...of -Map
 * Map结构的keys0)，values0，entries(方法返回值都具有lterator特性
 */
/**
 * 7.JSON序列化-Object
 * Object类型可以通过JSON.stringify()进行序列化操作
 * 7.JSON序列化-Map
 * Map结构不能直接进行JSON序列化
 * 序列化后返回一个空{}
 * 想要使用Map返回序列化的时候需要JSON.stringify(Array.form(map7/名称))
 * 返回结构：'[[" "," "],[" "," "]]'
 */
/**
 * 8.适用场景-Object
 * 1).仅做数据存储，并且属性仅为字符串或者Symbol
 * 2).需要进行序列化转换为json传输时
 * 3).当做一个对象的实例，需要保留自己的属性和方法时
 * 8.适用场景-Map
 * 1).会频繁更新和删除键值对时
 * 2).存储大量数据时，尤其是key类型未知的情况下
 * 3).需要频繁进行迭代处理
 */